/*
 * @Author: pengtianrui 2276608413@qq.com
 * @Date: 2024-07-19 14:42:56
 * @LastEditors: 武兴创 superjava@vip.qq.com
 * @LastEditTime: 2024-08-28 17:47:59
 * @FilePath: \SGFEM\DataStructure\FEM\Constraint\include\RBE3Data.h
 * @Description: RBE3 单元数据
 * BE3并不是一种刚性单元，而是一种插值单元。 可以将从节点上的载荷等效成作用到主节点集合上的等效力系
 * RBE3
 */

#pragma once
#include "DataStructure/Common/DataStructureNamespace.h"
#include "DataStructure/Common/Id.h"
#include "DataStructure/Common/Real.h"
#include "DataStructure/Input/Element/ElementBase.h"
#include "DataStructure/Input/Solver/DOFDirections.h"

SG_DATASTRUCTURE_FEM_NAMESPACE_OPEN
struct DECLSPEC RBE3Data : public ElementBase
{
    struct DECLSPEC WTCG
    {
        SG::DataStructure::Common::Real             m_wt1 = 0.0;
        SG::DataStructure::Common::Id               m_c   = 0;
        std::vector<SG::DataStructure::Common::I64> m_g;  /// 在平均方程中具有加权因子 WTi 的分量为 Ci 的网格点
    };

    struct DECLSPEC GM
    {
        SG::DataStructure::Common::Id m_gm = 0;
        SG::DataStructure::Common::Id m_cm = 0;
    };

    SG::DataStructure::Common::Id   m_refg     = 0;    ///< 参考网格点标识号
    SG::DataStructure::Common::Id   m_refc     = 0;    ///< 参考网格点处的分量编号
    SG::DataStructure::Common::Real m_alpha    = 0.0;  ///< 热膨胀系数
    SG::DataStructure::Common::Real m_tref     = 0.0;  ///< 参考温度
    SG::DataStructure::Common::Id   m_domainId = 0;
    std::vector<WTCG>               m_WTCG;            ///< 在网格点 Gi，j 的以下条目上运动分量的加权因子
    std::vector<GM>                 m_GM;              ///< M集中具有自由度的网格点的标识号
    // 获取从节点自由度
    DofSet GetREFDOF () const
    {
        return Int2VDofSet (m_refc);
    }

    DofSet GetWTCGDOFs (int i) const
    {
        return Int2VDofSet (m_WTCG[i].m_c);
    }
};

// inline bool operator== (const RBE3Data::WTCG::G& lhs, const RBE3Data::WTCG::G& rhs)
// {
//     if (lhs.m_g != rhs.m_g)
//     {
//         return false;
//     }
//     return true;
// };

/// @brief 判断两个WTCG是否相等
/// @param lhs
/// @param rhs
/// @return
DECLSPEC bool operator== (const RBE3Data::WTCG& lhs, const RBE3Data::WTCG& rhs);

/// @brief 判断两个GM是否相等
/// @param lhs
/// @param rhs
/// @return
DECLSPEC bool operator== (const RBE3Data::GM& lhs, const RBE3Data::GM& rhs);

/// @brief 判断两个RBE3Data是否相等
/// @param lhs
/// @param rhs
/// @return
DECLSPEC bool operator== (const RBE3Data& lhs, const RBE3Data& rhs);

SG_DATASTRUCTURE_FEM_NAMESPACE_CLOSE